'use strict';
/**
 * Created by QianQi on 2016/3/7.
 */
if(window._WI == undefined){
    window._WI = {};
}// 用于存放全局变量，在 $.getTopFrameWin() 时根据 _WI 判断是否在项目中
window.BASEPATH = $.getBasePath();
/* 左侧菜单接口 */
$.fn.initSidebar = function(_opts){
    var el = $(this);
    var opts = $.extend({
        //data:[],// 菜单数据源
        autoClick: true,// 设置数据时，若未指定选中项，是否选中第一个叶子节点
        onClick: $.noop// function(data)
    }, _opts);
    var api, oFilterApi;// 调用过滤组件 api
    var _data,
        _hashData = [],// 以hash形式保存菜单数据
        curI;// 记录当前选中的项在 _hashMenu 中的索引
    var jqTopbar,// 展开/收起菜单的元素
        jqMenuMain;// 第一级菜单元素
    var oScrollbarApi;// 滚动条组件 api
    var aMenuCls = ['sidemenu-root', 'sidemenu-sub', 'sidemenu-ssub'];// 不同层级的菜单对应的 class
    var _setData = function(data, curmenu){// 根据数据 data 绘制菜单，curmenu 定义当前激活菜单项的 code
        _data = data;
        _hashData.length = 0;
        var mainStr = '';// 第一个叶子节点
        curI = undefined;
        var strFn = function(datalist, type, level){// 直接追加 str
            var str = '';
            var subLevel = level + 1;
            if(datalist && datalist.length){
                var txtField = 'appname',
                    defaultIco = 'fa-list';
                var i, dataI,
                    len = datalist.length,
                    item, amsAppList,
                    hasSub;
                for(i = 0; i < len; i++){
                    item = datalist[i];
                    dataI = _hashData.length;// 在 _hashData 中的索引
                    item['__idx'] = dataI;
                    _hashData.push(item);
                    amsAppList = item['amsAppList'];
                    hasSub = !!(amsAppList && amsAppList.length);// 有子节点
                    if(typeof curI == 'undefined'){// 未指定选中节点
                        if(typeof curmenu == 'undefined'){
                            if(opts.autoClick && !hasSub){// 未指定选中项，默认选中第一个叶子节点
                                curI = dataI;
                            }
                        }
                        else{// 指定了选中项
                            if(curmenu == item['code'] || curmenu == item['appcode']){
                                curI = dataI;
                            }
                        }
                    }
                    str += '<li class="sidemenu' + (hasSub ? ' sidemenu-haschd' : '') + ' visible" data-i="' + dataI + '">';
                    str += '<div class="sidemenu-item" title="' + item[txtField] + '">' +
                        '<div class="sidemenu-icon fa ' + (item['ico_class'] || defaultIco) + '"></div>' +
                        '<div class="sidemenu-txt">' + item[txtField] + '</div>' +
                        '</div>';
                    if(hasSub){
                        str += '<ul class="sidemenu-list ' + aMenuCls[subLevel] + '">' +
                            strFn(amsAppList, 'app', subLevel) +
                            '</ul>';
                    }
                    str += '</li>';
                }
            }
            return str;
        };
        if(_data){// applications 由数组改为对象
            var _amsAppList = _data['amsAppList'],
                _level = 0;
            mainStr += strFn(_amsAppList, 'app', _level);
            if(_amsAppList && _amsAppList.length){
                //jqMenuMain.html('<ul class="sidemenu-list ' + aMenuCls[_level] + '">' + mainStr + '</ul>');// chd 或 app
                jqMenuMain.children('.sidemenu-list')
                          .addClass(aMenuCls[_level]).html(mainStr);// chd 或 app
            }
            if(typeof curI != 'undefined'){
                jqMenuMain.find('.sidemenu[data-i="' + curI + '"]').addClass('active');
            }
        }
        fResetUpDown();
        oFilterApi.setData(_hashData, '');
    };
    var fSidemenuChange = function(){
        var jqCurMenuItem = $(this),
            jqCurMenu = jqCurMenuItem.parent(),
            activeCls = 'active',
            openedCls = 'opened',
            hasChd = jqCurMenu.children('.sidemenu-list').length;
        if(hasChd){// 目录节点
            jqCurMenu.toggleClass(openedCls);
        }
        else if(!jqCurMenu.hasClass(activeCls)){// 叶子节点且不是当前菜单
            el.find('.sidemenu').removeClass(activeCls);
            jqCurMenu.addClass(activeCls);
        }
        curI = parseInt(jqCurMenu.attr('data-i'));
        opts.onClick(_hashData[curI]);
        if(hasChd){
            fResetUpDown();// 有子菜单，可能引起高度变化
        }
    };
    // 重新计算是否需要显示上下箭头
    var fResetUpDown = function(){// 菜单的高度变化事件
        oScrollbarApi.fResetSize();
    };
    var fGetCurData = function(){
        return _hashData[curI];
    };
    // 关键字过滤回调
    var fAfterFilter = function(newData, keyword){
        var jqsSubitem = jqMenuMain.find('.sidemenu-sub>.sidemenu');
        jqsSubitem.removeClass('visible');// 全部移除可见
        for(var i = 0, cur, len = newData.length; i < len; i++){
            cur = newData[i];
            jqsSubitem.filter('[data-i="' + cur['__idx'] + '"]').addClass('visible');
        }
        fResetUpDown();
    };
    var _init = function(){
        el.addClass('sidebar');
        jqTopbar = $('<div class="sidemenu-topbar">' +
            '<div class="sidemenu-search"><input class="txt txt-search" placeholder="请输入组件名称..." /></div>' +
            '</div>');
        jqMenuMain = $('<div class="sidemenu-main"><ul class="sidemenu-list"></ul></div>');
        el.prepend(jqTopbar, jqMenuMain);
        el.off('click.sidebarChange')// 菜单项点击事件
          .on('click.sidebarChange', '.sidemenu-item', fSidemenuChange);
        oFilterApi = jqTopbar.find('.txt').initFilter({// 过滤组件 api
            fields: 'appname',
            pySupport: false,// 不支持首字母
            afterFilter: fAfterFilter// 过滤完成后的回调函数，newData:过滤后的数据
        });
        oScrollbarApi = jqMenuMain.initScrollbar({});
        _setData(opts.data);
    };
    api = {
        setData: _setData,
        getCurData: fGetCurData,
        fResetUpDown: fResetUpDown
    };
    _init();
    return api;
};
$(function(){
    var oHideParams = $.getHideParams(),// <body> 下隐藏域键值对，name 为键
        oUrlParams = $.getUrlParams();// url 附加参数键值对
    var URLS = {
        //p_index: 'index.html', // 框架页地址
        p_main: 'main.html',// 首页
        sidePrefix: 'api/'// BASEPATH 侧边菜单页面路径前缀
    };
    var jqWrap = $('body>.wrap'),
        jqHeader = jqWrap.children('.header'),
        jqCont = jqWrap.children('.content'),
        jqContL = jqCont.children('.content-l'),
        jqContR = jqCont.children('.content-r'),
        jqFrame = jqContR.find('.js-mainframe');
    var applicationsApi;// 全部菜单
    // {undefined} applicationsApi.setData({Array}) 设置菜单数据
    /* 方法声明 */
    var fSetIndexData = function(){
        applicationsApi.setData(DATA.applications/*, oUrlParams['appcode']*/);
        // 根据当前选中项，修改iframe地址
        var curMenuData = applicationsApi.getCurData();
        if(curMenuData){
            document.title = curMenuData.appname;
            jqFrame.attr('src', URLS.sidePrefix + curMenuData.accessaddress || '');// TODO 根据当前菜单选中项，设置 iframe 地址
        }else{
            fHomeClick();
        }
    };
    /* 侧边菜单 */
    var onSidemenuClick = function(data){
        var code = data.appcode;
        if(typeof code!='undefined'){
            //window.location.href = URLS['p_index'] + '?appcode=' + code;
            document.title = data.appname;
            jqFrame.attr('src', URLS.sidePrefix + data.accessaddress || '');// TODO 根据当前菜单选中项，设置 iframe 地址
        }
    };
    var fHomeClick = function(){// 首页
        //window.open(URLS['p_main'], '_self');// 跳转至首页
        document.title = 'API for wiFrame';
        jqFrame.attr('src', URLS['p_main']);// TODO 根据当前菜单选中项，设置 iframe 地址
    };
    /** ==================== **/
        // 侧边菜单
    applicationsApi = jqContL.initSidebar({
        autoClick: false,// 设置数据时，是否默认选中第一个叶子
        onClick: onSidemenuClick
    });
    jqHeader.find('.js-home').on('click', fHomeClick);// 首页
    $(window).off('resize.win')
             .on('resize.win',applicationsApi.fResetUpDown);// window的监听菜单的高度
    fSetIndexData();// 快捷菜单、左侧菜单数据请求
});